<?php
//如仅仅只是想判断数据库出错：false情况，用“===”三个等号进行完全匹配判断，因为PHP是弱类型，0或空字符串也是false
//example:   $result = XHelper::add($map);     if($result === false){	echo "服务器繁忙！";	}
class BaseHelper {
	
	/**
	 * 新增操作
	 * @param  $data 要修改的数据，写入到这个数组里
	 * @return 如果数据非法或者查询错误则返回false，如果是自增主键 则返回主键值，否则返回1
	 * @example $result = add($data);
	 */
	public static function add($modelName, $data,$displaySQL = false) {
		$model = M ( $modelName );
		$result = $model->add ( $data );
		if($result === false){
			Log::write("SQL错误，具体原因：".$model->getDbError(),$modelName."Helper::add()", Log::ERR);
		}
		if($displaySQL != false){
			header("Content-Type: text/html; charset=utf-8");
			echo $modelName."Helper::add()执行的SQL语句为：<br/>".$model->getLastSql()."<br/>";
		}
		return $result;
	}
	
	/**
	 * 更新操作
	 * @param  $data 要修改的数据，写入到这个数组里
	 * @param  $whereStr 更新操作的WHERE条件语句
	 * @return 如果查询错误或者数据非法返回false，如果更新成功返回影响的记录数
	 * @example $result = update($data,"uid=22 AND name='k'");
	 */
	public static function update($modelName, $data, $whereStr="",$displaySQL = false) {
		$model = M ( $modelName );
		$result = $model->where ( $whereStr )->save ( $data );
		if($result === false){
			Log::write("SQL错误，具体原因：".$model->getDbError(),$modelName."Helper::update()", Log::ERR);
		}
		if($displaySQL != false){
			header("Content-Type: text/html; charset=utf-8");
			echo $modelName."Helper::update()执行的SQL语句为：<br/>".$model->getLastSql()."<br/>";
		}
  		return $result;
	}
	
	/**
	 * 更新操作
	 * @param  $data 要修改的数据，写入到这个数组里
	 * @param  $whereStr 更新操作的WHERE条件语句
	 * @return 如果查询错误或者数据非法返回false，如果更新成功返回影响的记录数
	 * @example $result = update($data,"uid=22 AND name='k'");
	 */
	public static function updateSQL($modelName, $sql,$displaySQL = false) {
		$model = M();
		$result = $model->execute($sql);
		if($result === false){
			Log::write("SQL错误，具体原因：".$model->getDbError(),$modelName."Helper::update()", Log::ERR);
		}
		if($displaySQL != false){
			header("Content-Type: text/html; charset=utf-8");
			echo $modelName."Helper::update()执行的SQL语句为：<br/>".$model->getLastSql()."<br/>";
		}
  		return $result;
	}
	
	/**
	 * 删除操作
	 * @param  $whereStr 删除操作的WHERE条件语句
	 * @return 如果查询错误返回false，如果删除成功返回影响的记录数
	 * @example $result = delete("uid=22 AND name='k'");
	 */
	public static function delete($modelName, $whereStr="",$displaySQL = false) {
		$model = M ( $modelName );
		$result = $model->where ( $whereStr )->delete ();
		if($result === false){
			Log::write("SQL错误，具体原因：".$model->getDbError(),$modelName."Helper::delete()", Log::ERR);
		}
		if($displaySQL != false){
			header("Content-Type: text/html; charset=utf-8");
			echo $modelName."Helper::delete()执行的SQL语句为：<br/>".$model->getLastSql()."<br/>";
		}
		return $result;
	}
	
	
	/**
	 * 根据$whereStr获取到数据对象
	 * @return 如果查询错误返回false，如果查询结果为空返回null，如果查询成功返回查询的结果（索引数组）
	 */
	public static function getObject($modelName, $whereStr="",$displaySQL = false) {
		$model = M ( $modelName );
		$result = $model->where ( $whereStr )->find ();
		if($result === false){
			Log::write("SQL错误，具体原因：".$model->getDbError(),$modelName."Helper::getObject()", Log::ERR);
		}
		if($displaySQL != false){
			header("Content-Type: text/html; charset=utf-8");
			echo $modelName."Helper::getObject()执行的SQL语句为：<br/>".$model->getLastSql()."<br/>";
		}
		return $result;
	}
	
	/**
	 * 根据SQL获取到数据对象,$sql 可以是普通类型也可是级联类型
	 * @return 如果查询错误返回false，如果查询结果为空返回null，如果查询成功返回查询的结果（索引数组）
	 */
	public static function queryObject($modelName,$sql,$displaySQL = false) {
		$model = M();
		$list = $model->query($sql);
		if($displaySQL != false){
			header("Content-Type: text/html; charset=utf-8");
			echo $modelName."Helper::queryObject()执行的SQL语句为：<br/>".$model->getLastSql()."<br/>";
		}
		if(!empty($list)){
			return $list[0];
		}
	}
	
	/**
	 * 根据SQL获取到数据对象,$sql 可以是普通类型也可是级联类型(PS:请误在SQL语句中加入AS XXX)
	 * @return 如果查询错误返回false，如果查询结果为空返回null，如果查询成功返回查询的结果（索引数组）
	 */
	public static function queryForInt($modelName,$sql,$displaySQL = false) {
		$model = M();
		$sqlBak = strtolower($sql);	//将$sql进行lower case，以便组成SQL的正确性
		$colum = substr($sql,strpos($sqlBak,"select ")+7,strpos($sqlBak," from ") - 7);
		$sqlCount = "SELECT ".$colum." AS count FROM " . substr($sql,strpos($sqlBak," from ") + 6, strlen($sqlBak));
		$list = $model->query($sqlCount);
		if($displaySQL != false){
			header("Content-Type: text/html; charset=utf-8");
			echo $modelName."Helper::queryObject()执行的SQL语句为：<br/>".$model->getLastSql()."<br/>";
		}
		if(!empty($list)){
			return $list[0]["count"];
		}else{
			return 0;
		}
	}
	
	/**
	 * 查询数据集LIST
	 * @param  $data 要修改的数据，写入到这个数组里
	 * @param  $whereStr 更新操作的WHERE条件语句
	 * @return 如果查询错误或者数据非法返回false，否则返回查询结果数据集
	 * @example $list = getList("uid>53","uid DESC"); getList(可变param)当什么参数都不传入，则为getAll功能
	 */
	public static function getList($modelName, $whereStr = '', $orderStr = '', $limitNum = 0,$displaySQL = false) {
		$model = M ( $modelName );
		$result = array();
		if ($limitNum != 0) {
			$result = $model->where ( $whereStr )->order ( $orderStr )->limit ( $limitNum )->select ();
		} else {
			$result = $model->where ( $whereStr )->order ( $orderStr )->select ();
		}
		if($result === false){
			Log::write("SQL错误，具体原因：".$model->getDbError(),$modelName."Helper::getList()", Log::ERR);
		}
		if($displaySQL != false){
			header("Content-Type: text/html; charset=utf-8");
			echo $modelName."Helper::getList()执行的SQL语句为：<br/>".$model->getLastSql()."<br/>";
		}
		return $result;
	}
	
	/**
	 * 查询数据集LIST,$sql 可以是普通类型也可是级联类型
	 * @param  $data 要修改的数据，写入到这个数组里
	 * @param  $whereStr 更新操作的WHERE条件语句
	 * @return 如果查询错误或者数据非法返回false，否则返回查询结果数据集
	 * @example $list = getList("uid>53","uid DESC"); getList(可变param)当什么参数都不传入，则为getAll功能
	 */
	public static function queryList($modelName, $sql = '',$displaySQL = false) {
		$model = M ();
		$list = $model->query($sql);
		if($displaySQL != false){
			header("Content-Type: text/html; charset=utf-8");
			echo $modelName."Helper::queryObject()执行的SQL语句为：<br/>".$model->getLastSql()."<br/>";
		}
		return $list;
	}
	

}
